module ALU(cin,s,datain,wt,ent,overflow,Rout,clk);
input clk;
input cin; //进位信号
input [2:0]s; //控制运算类型信号
input [7:0]datain; //从CPU中读入的数据
input wt,ent; //wt：控制写入信号 ent：控制写入A或B 

output reg overflow; //溢出信号
output reg [7:0]Rout; //R:结果

reg [7:0] A,B; // A,B寄存器
reg [8:0] a,b; //双符号位a,b寄存器
reg [8:0] R; //R:结果
//输入A或B
always @(posedge clk)
begin 
 if(~wt)
 begin
	if(ent) 
	begin 
		A=datain;
		a[7:0]=A;
		a[8]=a[7];
	end
	else 
	begin 
		B=datain;
		b[7:0]=B;
		b[8]=b[7];
	end
 end

//ALU 
  case(s)
    3'b000:begin R=8'h0;overflow=0;end //清零
	 3'b001:begin R=A&B;overflow=0;end //逻辑乘
	 3'b010:begin R=A|B;overflow=0;end //逻辑加
	 3'b011:begin R=A^B;overflow=0;end //逻辑异或
	 3'b100: //算数加
	   begin  
			R=a+b+cin;
			if(R[8]==R[7])
				overflow=0;
			else
				overflow=1;
		end
    3'b101:begin R=A<<1;overflow=0;end //逻辑左移
	 3'b110:begin R=A>>1;overflow=0;end //逻辑右移
	 3'b111: //算术右移
	   begin 
		  R=A>>1;
		  R[7]=R[6];
		  overflow=0;
		end
  endcase
  Rout=R[7:0];
end

endmodule


